package com.liuyucheng.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class CommonUtil {
    /**
     * 在指定目录下搜索特定后缀名的文件中包含的目标字符串，并输出所在文件和行号
     *
     * @param directoryPath 目录路径
     * @param fileExtension 要搜索的文件后缀名（例如：".txt"）
     * @param targetString 要查找的字符串
     */
    public static void searchStringInFiles(String directoryPath, String fileExtension, String targetString) {
        Path directory = Paths.get(directoryPath);

        // 检查目录是否存在
        if (!Files.exists(directory) || !Files.isDirectory(directory)) {
            System.out.println("目录不存在或不是一个有效的目录: " + directoryPath);
            return;
        }

        try {
            // 使用Files.walkFileTree遍历目录及其子目录
            Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    // 检查文件后缀名
                    String fileName = file.getFileName().toString();
                    if (fileName.endsWith(fileExtension)) {
                        // 读取文件并查找目标字符串
                        searchInFile(file, targetString);
                    }
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    System.err.println("访问文件失败: " + file + ", 错误: " + exc.getMessage());
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            System.err.println("遍历目录时发生错误: " + e.getMessage());
        }
    }

    /**
     * 在单个文件中查找目标字符串，并输出所在行号
     *
     * @param file 要搜索的文件
     * @param targetString 要查找的字符串
     * @throws IOException 如果读取文件时发生错误
     */
    private static void searchInFile(Path file, String targetString) throws IOException {
        try (BufferedReader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) {
            String line;
            int lineNumber = 0;

            while ((line = reader.readLine()) != null) {
                lineNumber++;
                if (line.contains(targetString)) {
                    System.out.printf("找到匹配: 文件=%s, 行号=%d, 内容: %s%n",
                            file.toString(), lineNumber, line);
                }
            }
        }
    }

    // 示例用法
    public static void main(String[] args) {
        // 示例：在当前目录下搜索所有.txt文件中的"example"字符串
        String directoryPath = "D:\\OneDrive\\临时文件夹\\gis_data";
        String fileExtension = ".xml";
        String targetString = "35kV海螺线311开关";

        searchStringInFiles(directoryPath, fileExtension, targetString);
    }
}
